import { reqGetUserInfo, reqLogin, reqGetUserInfoById } from '@/api/user'
import { getToken, removeToken, setToken } from '@/utils/auth'
import { resetRouter } from '@/router'
export default {
  namespaced: true,
  state: {
    token: getToken() || '',
    userInfo: {}
  },
  mutations: {
    setToken(state, newToken) {
      // token存入vuex
      state.token = newToken
      // token存入cookie
      setToken(newToken)
    },
    // 修改用户基本信息
    setUserInfo(state, newUserInfo) {
      state.userInfo = newUserInfo
    },
    removeToken(state) {
      state.token = '' // 清除vuex
      removeToken() // 清除本地
    },
    removeUserInfo(state) {
      state.userInfo = {}
    },
    // 实时更新头像
    setUrl(state, url) {
      state.userInfo.staffPhoto = url
    }
  },
  actions: {
    async login(context, data) {
      const res = await reqLogin(data)
      console.log(res)
      context.commit('setToken', res.data)
    },
    async getUserInfo({ commit }) {
      // 获取用户信息
      const res = await reqGetUserInfo()
      // console.log('获取基本信息', res)

      // 因为用户头像的数据，不在第一个接口里面，所以要重新发送请求，想要头像数据都房子用户基本资料里，所以封装在一起
      const resImg = await reqGetUserInfoById(res.data.userId) // 包含头像的资料
      // console.log('获取头像', resImg)
      // 合并对象 利用{...obj1,...obj2}或者利用Object.assign()
      const userInfoObj = Object.assign(res.data, resImg.data)
      console.log('合并后的对象', userInfoObj)
      // 需要合并数据，整合到userInfo，所以将合并后的对象传给userInfo
      commit('setUserInfo', userInfoObj)

      return userInfoObj // 注意：这里必须要return, 这里return什么值，注册的相应函数就打印什么值
    },
    // 清除token和userInfo
    logout(context) {
      // 清空token
      context.commit('removeToken')
      // 清空用户信息
      context.commit('removeUserInfo')
      // 重置路由
      resetRouter()
      // 清空vuex的permission模块routes
      // 配置第三个参数{root:true} 开启找全局 - 不要找我自己
      // 全局命名空间内分发 action 或提交 mutation
      context.commit('permission/setRoutes', [], { root: true })
    },
    // 将头像地址传给userInfo
    setUrl({ commit, state }, payload) {
      if (state.userInfo.id === payload.userId) {
        commit('setUrl', payload.url)
      }
    }
  }
}
